package com.hxh.usermanagementsystem.controller;

import com.hxh.usermanagementsystem.model.UserInfo;
import com.hxh.usermanagementsystem.service.UserService;
import com.hxh.usermanagementsystem.util.ConstVariable;
import com.hxh.usermanagementsystem.util.PasswordUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/7/7 1:07
 */
@RestController
@Slf4j  // 用于打印日志, 调试移动端
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public boolean login(HttpServletRequest request, String loginname, String password) {
        // 参数校验
        if (StringUtils.hasLength(loginname) && StringUtils.hasLength(password)) {
            // 参数有效
            // 基于随机盐值的md5密码加密
            UserInfo userInfo = userService.getUserByLoginName(loginname);
            if (userInfo != null && userInfo.getUid() > 0) {
                // 拿到数据库中 随即盐值 + $ + 加密密码
                String dbPassword = userInfo.getPassword();
                // 比较密码是否相同
                if (PasswordUtil.decrypt(password, dbPassword)) {  // 登录成功
                    // 存储 Session
                    HttpSession session = request.getSession(true);
                    session.setAttribute(ConstVariable.USER_SESSION_KEY, userInfo);
                    return true;
                }
            }
        }
        return false;
    }

    // 查询所有列表(无分页)
    @RequestMapping("/list")
    public List<UserInfo> getAll() {
        return userService.getAll();
    }

    // 查询所有列表(带分页和条件查询)
    // 返回的 HashMap 包含列表和用户信息总条数
    @RequestMapping("/listbypage")
    public HashMap<String, Object> getListByPage(String username,
                                                 String address,
                                                 String email,
                                                 Integer pindex,
                                                 Integer psize) {
        HashMap<String, Object> result = new HashMap<>();
        // 参数合法性检验, 若参数无效, 则设置默认值
        if (pindex == null || pindex < 1) {
            pindex = 1;  // 若参数无效, 则显示第 1 页数据
        }
        if (psize == null || psize <= 0) {
            psize = 5;  // 若参数无效, 则每页显示 5 条数据
        }
        if (!StringUtils.hasLength(username)) {
            username = null;
        }
        if (!StringUtils.hasLength(address)) {
            address = null;
        }
        if (!StringUtils.hasLength(email)) {
            email = null;
        }
        int offset = (pindex - 1) * psize;
        // 查询需求页码的用户信息数据
        List<UserInfo> list = userService.getListByPage(username, address, email, psize, offset);
        // 获取用户信息总条数
        int totalCount = userService.getListByPageCount(username, address, email);
        // 构造响应并返回
        result.put("list", list);
        result.put("count", totalCount);
        return result;
    }

    // 添加用户(只有超级管理员有权限添加用户)
    @RequestMapping("/add")
    public int add(UserInfo userInfo, HttpServletRequest request) {
        int result = 0;
        if (userInfo == null
            || !StringUtils.hasLength(userInfo.getUsername())
            || !StringUtils.hasLength(userInfo.getPassword())
            || !StringUtils.hasLength(userInfo.getLoginname())) {
            // 参数非空校验
            return result;
        }
        // 验证是否为超级管理员
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute(ConstVariable.USER_SESSION_KEY) == null) return result;
        UserInfo loginUser = (UserInfo) session.getAttribute(ConstVariable.USER_SESSION_KEY);
        if (!loginUser.isIsadmin()) return result;
        // 对登录名进行唯一校验, 如果登录名存在, 则无法添加
        UserInfo loginNameUser = userService.getUserByLoginName(userInfo.getLoginname());
        if (loginNameUser != null && loginNameUser.getUid() > 0) return result;
        // 添加用户到数据库
        userInfo.setPassword(PasswordUtil.encrypt(userInfo.getPassword()));  // 对密码进行加密处理
        result = userService.add(userInfo);
        return result;
    }

    // 根据 uid 查询用户信息, 用于填充修改界面的默认信息
    @RequestMapping("/getuserbyuid")
    public UserInfo getUserByUid(Integer uid) {
        UserInfo userInfo = null;
        // 非空校验
        if (uid == null) return userInfo;
        // 查询数据库
        userInfo = userService.getUserByUid(uid);
        if (userInfo == null) return userInfo;
        // 将密码隐藏
        userInfo.setPassword("");
        return userInfo;
    }

    // 修改用户信息
    @RequestMapping("/update")
    public int update(UserInfo userInfo, HttpServletRequest request) {
        int result = 0;
        // 非空校验
        if (userInfo == null || userInfo.getUid() <= 0
                || !StringUtils.hasLength(userInfo.getUsername())) {
            // 参数非空校验
            return result;
        }
        // 验证是否为超级管理员
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute(ConstVariable.USER_SESSION_KEY) == null) return result;
        UserInfo loginUser = (UserInfo) session.getAttribute(ConstVariable.USER_SESSION_KEY);
        if (!loginUser.isIsadmin()) return result;
        // 修改用户信息
        if (StringUtils.hasLength(userInfo.getPassword())) {
            userInfo.setPassword(PasswordUtil.encrypt(userInfo.getPassword()));  // 对密码进行加密处理
        }
        result = userService.update(userInfo);
        return result;
    }

    // 删除单条用户信息
    @RequestMapping("/del")
    public int del(Integer uid, HttpServletRequest request) {
        // 非空校验
        if (uid == null) return 0;
        // 判断删除的用户是否为当前登录的用户, 如果是则不能删除
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute(ConstVariable.USER_SESSION_KEY) == null) return 0;
        int loginUserUid = ((UserInfo) session.getAttribute(ConstVariable.USER_SESSION_KEY)).getUid();
        if (uid == loginUserUid) {
            return 0;
        }
        // 删除
        return userService.del(uid);
    }

    // 删除多条用户信息
//    @Transactional
    @RequestMapping("/delbyids")
    public int dels(String ids, HttpServletRequest request) {
        if (!StringUtils.hasLength(ids)) return 0;
        // 拿到的 ids 是形如 1,2,3,4, 以,结尾的 uid 拼接而成的字符串, 后端进行处理
        String[] idsArr = ids.split(",");
        if (idsArr.length <= 0) return 0;
        // 拿到当前登录的用户的 uid , 用于检查判断删除的数据中不包含当前用户
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute(ConstVariable.USER_SESSION_KEY) == null) return 0;
        int loginUserUid = ((UserInfo) session.getAttribute(ConstVariable.USER_SESSION_KEY)).getUid();
        // 将 ids 构造成 List 交给 service 处理
        List<Integer> idsList = new ArrayList<>();
        for (String item : idsArr) {
            if (StringUtils.hasLength(item)) {
                int thisUid = Integer.parseInt(item);
                // 判断选中的记录中是否包含当前登录的用户, 如果有, 则不能删除
                if (thisUid == loginUserUid) {
                    return 0;
                }
                idsList.add(thisUid);
            }
        }
        int result = userService.dels(idsList);
//        System.out.println(result);
//        // 回滚事务
//        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        return result;
    }
}
